/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.sapra.Prefactura;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import org.sapra.dao.Periodo;
import org.sapra.dep.Practicante;

/**
 *
 * @author ppratsc
 */
public class Laborales {
    public static int SegundaQuincena(Periodo periodo,Date dia){
        //Regresa la diferencia a la derecha calculando los 28,29,30 y 31 de fin de mes
        //Segun el Calendario Laboral Mexicano
        SimpleDateFormat fmt = new SimpleDateFormat("dd");
        //En que termina el mes?
        int end = Integer.parseInt(fmt.format(periodo.fin));
        int day = Integer.parseInt(fmt.format(dia));
        int tmx = end - day;

        if(tmx == 0 )return 1; // Cae en el dia final
        if(end == 31) tmx--; //Ajusta a 30 dias laborales

        return tmx;
    }


    static int ControlTermino(Periodo periodo, Date termino) {
        //Indica cuantos dias se van a pagar en el presente periodo segun sea el caso
        SimpleDateFormat fmt = new SimpleDateFormat("dd");
        //Segunda Quincena
        int resp = 0;
        int tmx = Integer.parseInt(fmt.format(periodo.fin));
        if(periodo.diaspagar == 15 &&  tmx == 16)
            return SegundaQuincena(periodo,termino);

        long xtm = periodo.fin.getTime() - termino.getTime();
        xtm = xtm / 86400000; // Dias de Diferencia
        resp = periodo.diaspagar - (int) xtm;
        if(periodo.diaspagar == 30 && tmx == 31) resp++;

        return resp;
    }

    static int ControlInicio(Periodo periodo, Date inicio) {
        //Indica cuantos dias se van a pagar en el presente periodo segun sea el caso
        SimpleDateFormat fmt = new SimpleDateFormat("dd");
        //Segunda Quincena
        int resp = 0;
        int tmx = Integer.parseInt(fmt.format(periodo.ini));
        if(periodo.diaspagar == 15 &&  tmx == 16)
            return SegundaQuincena(periodo,inicio);

        long xtm = periodo.fin.getTime() - inicio.getTime();
        xtm = xtm / 86400000; // Dias de Diferencia
        resp = (int) xtm + 1;

        tmx = Integer.parseInt(fmt.format(periodo.fin));
        if(periodo.diaspagar == 30 && tmx == 31) resp++;

        return resp;
    }

    static HashMap universalDay(Practicante p,Periodo per){
        Date auxini;
        Date auxfin;
        HashMap mapa=new HashMap();
        Calendar cal=Calendar.getInstance();
        cal.setTime(per.fin);
        Date difs=new Date();

        System.out.println(p.toString()+p.id+p.fechaCancelacion);

        ////////////////ANALIZA SI EL FIN DEL PERIODO ES DE 28 0 29 DIAS////////////
        if(cal.get(Calendar.DAY_OF_MONTH)==28||cal.get(Calendar.DAY_OF_MONTH)==29){
            //difs.setTime(per.fin.getTime()-(1*24*60*60*1000));
            difs=per.fin;
        }
        //////////ANALIZA SI EL FIN DEL PERIODO ES DE 31 DIAS////////////////
        if(cal.get(Calendar.DAY_OF_MONTH)==31){
            difs.setTime(per.fin.getTime()-(1*24*60*60*1000));
        }
           else{
            difs=per.fin;
          }

        /////////////ASIGNACION DE FECHAS////////////////////////////////////
        try {
            if(p.fechaInicio.equals(per.fin)){
                auxini=p.fechaInicio;
            }else{
                auxini=per.ini;
            }

            if(p.fechaInicio.after(per.ini)){
                auxini=p.fechaInicio;
            }else{
                auxini=per.ini;
            }

            if(p.fechaTermino.before(difs)){
                auxfin=p.fechaTermino;
            }else{
                auxfin=difs;
            }

            if(p.fechaCancelacion != null){
                if(p.fechaCancelacion.before(difs)){
                    auxfin=p.fechaCancelacion;
                }
            }

             if(p.fechaCancelacion != null){
                if(p.fechaCancelacion.equals(difs)){
                    auxfin=p.fechaCancelacion;
                }
            }


            mapa.put("inicio", auxini);
            mapa.put("fin", auxfin);

            Calendar fecha=Calendar.getInstance();
            fecha.setTime(difs);

            if(fecha.get(Calendar.DAY_OF_MONTH)==28||fecha.get(Calendar.DAY_OF_MONTH)==29){
                if(p.fechaCancelacion!=null){
                    if(p.fechaCancelacion.getTime()<difs.getTime()){
                        int dias=(int)(p.fechaCancelacion.getTime()-per.ini.getTime())/(1000*60*60*24);
                        mapa.put("dias", dias);
                        return mapa;

                    }
                }

                //aqui
                if(p.fechaTermino.getTime()<difs.getTime()){
                    int dias=(int)((p.fechaTermino.getTime()-per.ini.getTime())/(86400000));
                    dias=dias+1;
                    mapa.put("dias", dias);
                    return mapa;

                }
            }

            if(auxini.equals(auxfin)){
                mapa.put("dias", 1);
                return mapa;
            }

            if((auxini.equals(per.ini) && auxfin.equals(difs))){
                mapa.put("dias", per.diaspagar);
                return mapa;
        }


            int counter=0;
            Calendar c1=Calendar.getInstance();

            while(auxini.getTime()<=auxfin.getTime()){
                counter++;
                c1=Calendar.getInstance();
                c1.setTime(auxini);
                c1.add(Calendar.DATE, 1);
                auxini=c1.getTime();
            }
            if(counter>=per.diaspagar){
                mapa.put("dias", per.diaspagar);
                return mapa;
            }else{
                mapa.put("dias", counter);
                return mapa;
            }


        } catch (Exception e) {
        }
        return mapa;
    }

    static int DayCountInician(Periodo per,Practicante p){
        int dias=0;
        try {
            Date comodin=new Date();
            if(p.fechaInicio.getTime()>per.ini.getTime())
                comodin=p.fechaInicio;
            else
                comodin=per.ini;

            dias=(int)((per.fin.getTime()-comodin.getTime())/86400000)+1;


        } catch (Exception e) {
            System.out.println("An Exception As Ocurred");
        }
        return dias;
    }
    static int DayCountTerminan(Periodo per,Practicante p){
        int dias=0;
        try {
            Date comodin=new Date();/*
            if(per.fin.getTime()>p.fechaTermino.getTime())
                comodin=per.fin;
            else
                comodin=p.fechaTermino;*/
             dias=(int)((p.fechaTermino.getTime()-per.ini.getTime())/86400000)+1;

        } catch (Exception e) {
             System.out.println("An Exception As Ocurred");
        }
        return dias;
    }
    static int DayCountCancelan(Periodo per,Practicante p){
        int dias=0;
        try {
            Date comodinInicio=new Date();
            Date comodinFin=new Date();
            if(p.fechaCancelacion!=null)
                comodinFin=p.fechaCancelacion;
            else
                comodinFin=per.fin;

            if(p.fechaInicio.getTime()>per.ini.getTime())
                comodinInicio=p.fechaInicio;
            else
                comodinInicio=per.ini;

            dias=(int)((comodinFin.getTime()-comodinInicio.getTime())/86400000)+1;

            /*
            if(per.fin.getTime()>p.fechaTermino.getTime())
                comodin=per.fin;
            else
                comodin=p.fechaTermino;
             dias=(int)((comodin.getTime()-per.ini.getTime()/86400000))+1;
*/
        } catch (Exception e) {
             System.out.println("An Exception As Ocurred");
        }
        return dias;

    }

}
